Fox's Git Mirrors
Commit 560b75d6bb5ba14dc594727e5cc7c7bbf0ed0f3c
Parents : df4ed5a
Author : Shane Smiskol <shane@smiskol.com>
Signature : Signature validation error
Date : 2026-05-31T02:08:32-07:00
Committer : GitHub <noreply@github.com>
Date : 2026-05-31T02:08:32-07:00
Reapply "Nissan: use high precision steering angle" (#3423)
* Revert "Revert "Nissan: use high precision steering angle" (#3420)"
This reverts commit b959fafb6a792e1fcb5f1cc73991ca3d575d6393.
* update safety
* it's always bus 0
* fix test
* flip
* static
Changes
3 files changed, 25 insertions(+), 24 deletions(-)
Diff
diff --git a/opendbc/car/nissan/carstate.py b/opendbc/car/nissan/carstate.py
index 1bd5ad17..9b4df5e2 100644
--- a/opendbc/car/nissan/carstate.py
+++ b/opendbc/car/nissan/carstate.py
@@ -91,16 +91,16 @@ class CarState(CarStateBase):
if self.CP.carFingerprint == CAR.NISSAN_ALTIMA:
ret.steeringTorque = cp_cam.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"]
ret.steerFaultTemporary = cp_cam.vl["STEER_TORQUE_SENSOR"]["LKAS_STATUS"] == 9
+ ret.steeringAngleDeg = cp_cam.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"]
else:
ret.steeringTorque = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"]
ret.steerFaultTemporary = cp.vl["STEER_TORQUE_SENSOR"]["LKAS_STATUS"] == 9
+ ret.steeringAngleDeg = cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"]
self.steeringTorqueSamples.append(ret.steeringTorque)
# Filtering driver torque to prevent steeringPressed false positives
ret.steeringPressed = bool(abs(sum(self.steeringTorqueSamples) / TORQUE_SAMPLES) > CarControllerParams.STEER_THRESHOLD)
- ret.steeringAngleDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_ANGLE"]
-
ret.leftBlinker = bool(cp.vl["LIGHTS"]["LEFT_BLINKER"])
ret.rightBlinker = bool(cp.vl["LIGHTS"]["RIGHT_BLINKER"])
diff --git a/opendbc/safety/modes/nissan.h b/opendbc/safety/modes/nissan.h
index 9289935f..eec552c1 100644
--- a/opendbc/safety/modes/nissan.h
+++ b/opendbc/safety/modes/nissan.h
@@ -4,20 +4,35 @@
static bool nissan_alt_eps = false;
+static const AngleSteeringLimits NISSAN_STEERING_LIMITS = {
+ .max_angle = 60000, // 600 deg, reasonable limit
+ .angle_deg_to_can = 100,
+ .angle_rate_up_lookup = {
+ {0., 5., 15.},
+ {5., .8, .15}
+ },
+ .angle_rate_down_lookup = {
+ {0., 5., 15.},
+ {5., 3.5, .4}
+ },
+};
+
static void nissan_rx_hook(const CANPacket_t *msg) {
- if (msg->bus == (nissan_alt_eps ? 1U : 0U)) {
- if (msg->addr == 0x2U) {
+ // Altima: on camera bus, others: on pt bus
+ if (msg->bus == 0U) {
+ if (msg->addr == 0x185U) {
// Current steering angle
- // Factor -0.1, little endian
- int angle_meas_new = (GET_BYTES(msg, 0, 4) & 0xFFFFU);
- // Multiply by -10 to match scale of LKAS angle
- angle_meas_new = to_signed(angle_meas_new, 16) * -10;
+ int angle_meas_new = (msg->data[2] << 10) | (msg->data[3] << 2) | (msg->data[4] >> 6);
+ // Factor is -0.01, offset is 1310. Flip to correct sign, but keep units in CAN scale
+ angle_meas_new = -angle_meas_new + (1310.0f * NISSAN_STEERING_LIMITS.angle_deg_to_can);
// update array of samples
update_sample(&angle_meas, angle_meas_new);
}
+ }
+ if (msg->bus == (nissan_alt_eps ? 1U : 0U)) {
if (msg->addr == 0x285U) {
// Get current speed and standstill
uint16_t right_rear = (msg->data[0] << 8) | (msg->data[1]);
@@ -54,19 +69,6 @@ static void nissan_rx_hook(const CANPacket_t *msg) {
static bool nissan_tx_hook(const CANPacket_t *msg) {
- const AngleSteeringLimits NISSAN_STEERING_LIMITS = {
- .max_angle = 60000, // 600 deg, reasonable limit
- .angle_deg_to_can = 100,
- .angle_rate_up_lookup = {
- {0., 5., 15.},
- {5., .8, .15}
- },
- .angle_rate_down_lookup = {
- {0., 5., 15.},
- {5., 3.5, .4}
- },
- };
-
bool tx = true;
bool violation = false;
@@ -109,8 +111,7 @@ static safety_config nissan_init(uint16_t param) {
// Signals duplicated below due to the fact that these messages can come in on either CAN bus, depending on car model.
static RxCheck nissan_rx_checks[] = {
- {.msg = {{0x2, 0, 5, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true},
- {0x2, 1, 5, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }}}, // STEER_ANGLE_SENSOR
+ {.msg = {{0x185, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // STEER_TORQUE_SENSOR
{.msg = {{0x285, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true},
{0x285, 1, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }}}, // WHEEL_SPEEDS_REAR
{.msg = {{0x30f, 2, 3, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true},
diff --git a/opendbc/safety/tests/test_nissan.py b/opendbc/safety/tests/test_nissan.py
index 8f034cd7..7b5e6781 100755
--- a/opendbc/safety/tests/test_nissan.py
+++ b/opendbc/safety/tests/test_nissan.py
@@ -38,7 +38,7 @@ class TestNissanSafety(common.CarSafetyTest, common.AngleSteeringSafetyTest):
def _angle_meas_msg(self, angle: float):
values = {"STEER_ANGLE": angle}
- return self.packer.make_can_msg_safety("STEER_ANGLE_SENSOR", self.EPS_BUS, values)
+ return self.packer.make_can_msg_safety("STEER_TORQUE_SENSOR", 0, values)
def _pcm_status_msg(self, enable):
values = {"CRUISE_ENABLED": enable}
Served by rngit 1.5.0 - Generated in 0.06s